home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / nops / Alpha.pm next >
Text File  |  2006-06-30  |  7KB  |  216 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Nop::Alpha;
  11. use strict;
  12. use base 'Msf::Nop';
  13. use Pex::Utils;
  14.  
  15. my $advanced = { };
  16. my $info = {
  17.     'Name'    => 'Alpha Nop Generator',
  18.     'Version' => '$Revision: 1.8 $',
  19.     'Authors' => [ 'vlad902 <vlad902 [at] gmail.com>', ],
  20.     'Arch'    => [ 'alpha' ],
  21.     'Desc'    =>  'Alpha nop generator',
  22.     'Refs'    => [ ],
  23. };
  24.  
  25.  
  26. sub new {
  27.     my $class = shift; 
  28.     return($class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_));
  29. }
  30.  
  31. # XXX: Operate: */v?
  32. # XXX: InsMemory (for lda and the like) 
  33. # Bad: ct[lt]z, ctpop, ld[bw]u, sext[bw], st[bw], sqrt*, ftoi*, itof*, max*, min*, perr, (un)pk*, FPU anything 
  34. my $table = [
  35.     [ \&InsBranch,    [ 0x30 ], ],                # br
  36.     [ \&InsBranch,    [ 0x31 ], ],                # fbeq
  37.     [ \&InsBranch,    [ 0x32 ], ],                # fblt
  38.     [ \&InsBranch,    [ 0x33 ], ],                # fble
  39.     [ \&InsBranch,    [ 0x35 ], ],                # fbne
  40.     [ \&InsBranch,    [ 0x36 ], ],                # fbge
  41.     [ \&InsBranch,    [ 0x37 ], ],                # fbgt
  42.     [ \&InsBranch,    [ 0x38 ], ],                # blbc
  43.     [ \&InsBranch,    [ 0x39 ], ],                # beq
  44.     [ \&InsBranch,    [ 0x3a ], ],                # blt
  45.     [ \&InsBranch,    [ 0x3b ], ],                # ble
  46.     [ \&InsBranch,    [ 0x3c ], ],                # blbs
  47.     [ \&InsBranch,    [ 0x3d ], ],                # bne
  48.     [ \&InsBranch,    [ 0x3e ], ],                # bge
  49.     [ \&InsBranch,    [ 0x3f ], ],                # bgt
  50.  
  51.     [ \&InsOperate,    [ 0, [ 0x10, 0x00 ] ], ],        # addl
  52.     [ \&InsOperate,    [ 0, [ 0x10, 0x02 ] ], ],        # s4addl
  53.     [ \&InsOperate,    [ 0, [ 0x10, 0x09 ] ], ],        # subl
  54.     [ \&InsOperate,    [ 0, [ 0x10, 0x0b ] ], ],        # s4subl
  55.     [ \&InsOperate,    [ 0, [ 0x10, 0x0f ] ], ],        # cmpbge
  56.     [ \&InsOperate,    [ 0, [ 0x10, 0x12 ] ], ],        # s8addl
  57.     [ \&InsOperate,    [ 0, [ 0x10, 0x1b ] ], ],        # s8subl
  58.     [ \&InsOperate,    [ 0, [ 0x10, 0x1d ] ], ],        # cmpult
  59.     [ \&InsOperate,    [ 0, [ 0x10, 0x20 ] ], ],        # addq
  60.     [ \&InsOperate,    [ 0, [ 0x10, 0x22 ] ], ],        # s4addq
  61.     [ \&InsOperate,    [ 0, [ 0x10, 0x29 ] ], ],        # subq
  62.     [ \&InsOperate,    [ 0, [ 0x10, 0x2b ] ], ],        # s4subq
  63.     [ \&InsOperate,    [ 0, [ 0x10, 0x2d ] ], ],        # cmpeq
  64.     [ \&InsOperate,    [ 0, [ 0x10, 0x32 ] ], ],        # s8addq
  65.     [ \&InsOperate,    [ 0, [ 0x10, 0x3b ] ], ],        # s8subq
  66.     [ \&InsOperate,    [ 0, [ 0x10, 0x3d ] ], ],        # cmpule
  67.     [ \&InsOperate,    [ 0, [ 0x10, 0x4d ] ], ],        # cmplt
  68.     [ \&InsOperate,    [ 0, [ 0x10, 0x6d ] ], ],        # cmple
  69.  
  70.     [ \&InsOperate,    [ 0, [ 0x11, 0x00 ] ], ],        # and
  71.     [ \&InsOperate,    [ 0, [ 0x11, 0x08 ] ], ],        # bic (andnot)
  72.     [ \&InsOperate,    [ 0, [ 0x11, 0x14 ] ], ],        # cmovlbs
  73.     [ \&InsOperate,    [ 0, [ 0x11, 0x16 ] ], ],        # cmovlbc
  74.     [ \&InsOperate,    [ 0, [ 0x11, 0x20 ] ], ],        # bis (or)
  75.     [ \&InsOperate,    [ 0, [ 0x11, 0x24 ] ], ],        # cmoveq
  76.     [ \&InsOperate,    [ 0, [ 0x11, 0x26 ] ], ],        # cmovne
  77.     [ \&InsOperate,    [ 0, [ 0x11, 0x28 ] ], ],        # ornot
  78.     [ \&InsOperate,    [ 0, [ 0x11, 0x40 ] ], ],        # xor
  79.     [ \&InsOperate,    [ 0, [ 0x11, 0x44 ] ], ],        # cmovlt
  80.     [ \&InsOperate,    [ 0, [ 0x11, 0x46 ] ], ],        # cmovge
  81.     [ \&InsOperate,    [ 0, [ 0x11, 0x48 ] ], ],        # eqv (xornot)
  82.     [ \&InsOperate,    [ 0, [ 0x11, 0x64 ] ], ],        # cmovle
  83.     [ \&InsOperate,    [ 0, [ 0x11, 0x66 ] ], ],        # cmovgt
  84.  
  85.     [ \&InsOperate,    [ 0, [ 0x12, 0x02 ] ], ],        # mskbl
  86.     [ \&InsOperate,    [ 0, [ 0x12, 0x06 ] ], ],        # extbl
  87.     [ \&InsOperate,    [ 0, [ 0x12, 0x0b ] ], ],        # insbl
  88.     [ \&InsOperate,    [ 0, [ 0x12, 0x12 ] ], ],        # mskwl
  89.     [ \&InsOperate,    [ 0, [ 0x12, 0x16 ] ], ],        # extwl
  90.     [ \&InsOperate,    [ 0, [ 0x12, 0x1b ] ], ],        # inswl
  91.     [ \&InsOperate,    [ 0, [ 0x12, 0x22 ] ], ],        # mskll
  92.     [ \&InsOperate,    [ 0, [ 0x12, 0x26 ] ], ],        # extll
  93.     [ \&InsOperate,    [ 0, [ 0x12, 0x2b ] ], ],        # insll
  94.     [ \&InsOperate,    [ 0, [ 0x12, 0x30 ] ], ],        # zap 
  95.     [ \&InsOperate,    [ 0, [ 0x12, 0x31 ] ], ],        # zapnot
  96.     [ \&InsOperate,    [ 0, [ 0x12, 0x32 ] ], ],        # mskql
  97.     [ \&InsOperate,    [ 0, [ 0x12, 0x34 ] ], ],        # srl
  98.     [ \&InsOperate,    [ 0, [ 0x12, 0x36 ] ], ],        # extql
  99.     [ \&InsOperate,    [ 0, [ 0x12, 0x39 ] ], ],        # sll
  100.     [ \&InsOperate,    [ 0, [ 0x12, 0x3b ] ], ],        # insql
  101.     [ \&InsOperate,    [ 0, [ 0x12, 0x3c ] ], ],        # sra
  102.     [ \&InsOperate,    [ 0, [ 0x12, 0x52 ] ], ],        # mskwh
  103.     [ \&InsOperate,    [ 0, [ 0x12, 0x57 ] ], ],        # inswh
  104.     [ \&InsOperate,    [ 0, [ 0x12, 0x5a ] ], ],        # extwh
  105.     [ \&InsOperate,    [ 0, [ 0x12, 0x62 ] ], ],        # msklh
  106.     [ \&InsOperate,    [ 0, [ 0x12, 0x67 ] ], ],        # inslh
  107.     [ \&InsOperate,    [ 0, [ 0x12, 0x6a ] ], ],        # extlh
  108.     [ \&InsOperate,    [ 0, [ 0x12, 0x72 ] ], ],        # mskqh
  109.     [ \&InsOperate,    [ 0, [ 0x12, 0x77 ] ], ],        # insqh
  110.     [ \&InsOperate,    [ 0, [ 0x12, 0x7a ] ], ],        # extqh
  111.  
  112.     [ \&InsOperate,    [ 0, [ 0x13, 0x00 ] ], ],        # mull
  113.     [ \&InsOperate,    [ 0, [ 0x13, 0x20 ] ], ],        # mulq
  114.     [ \&InsOperate,    [ 0, [ 0x13, 0x30 ] ], ],        # umulh
  115. ];
  116.  
  117. # Returns valid destination register number between 0 and 31 excluding $sp.
  118. # XXX: $gp/$ra/$fp???
  119. sub get_dst_reg {
  120.     my $reg = int(rand(31));
  121.     $reg += ($reg >= 30);
  122.  
  123.     return $reg;
  124. }
  125.  
  126. # Any register.
  127. sub get_src_reg {
  128.     return int(rand(32));
  129. }
  130. sub get_src_freg {
  131.     return int(rand(32));
  132. }
  133. sub get_dst_freg {
  134.     return int(rand(32));
  135. }
  136.  
  137. sub InsOperate {
  138.     my $ref = shift;
  139.  
  140.     my $ver = $ref->[0];
  141.  
  142. # 0, ~1, !2, ~3, !4
  143. # Use one src reg with an unsigned 8-bit immediate (non-0)
  144.     if(($ver == 0 && int(rand(2))) || $ver == 1)
  145.     {
  146.         return pack("V", (($ref->[1][0] << 26) | (get_src_reg() << 21) | ((int(rand((1 << 8) - 1)) + 1) << 13) | (1 << 12) | ($ref->[1][1] << 5) | get_dst_reg()));
  147.     }
  148. # Use two src regs
  149.     else
  150.     {
  151.         return pack("V", (($ref->[1][0] << 26) | (get_src_reg() << 21) | (get_src_reg() << 16) | ($ref->[1][1] << 5) | get_dst_reg()));
  152.     }
  153. }
  154.  
  155. sub InsFPU {
  156.     my $ref = shift;
  157.  
  158.     return pack("V", (($ref->[0] << 26) | (get_src_freg() << 21) | (get_src_freg() << 16) | ($ref->[1] << 5) | get_dst_freg()));
  159. }
  160.  
  161. sub InsBranch {
  162.     my $ref = shift;
  163.     my $len = shift;
  164.  
  165.     $len = ($len / 4) - 1; 
  166.  
  167.     return if(! $len);
  168.     $len = 0xfffff if($len > 0x100000);
  169.  
  170.     return pack("V", (($ref->[0] << 26) | (get_src_reg() << 21) | (int(rand($len - 1) + 1))));
  171. }
  172.  
  173. sub Nops {
  174.     my $self = shift;
  175.     my $length = shift;
  176.     my $backup_length = $length;
  177.  
  178.     my $exploit = $self->GetVar('_Exploit');
  179.     my $random  = $self->GetVar('RandomNops');
  180.     my $badChars = $exploit->PayloadBadChars;
  181.     my ($nop, $tempnop, $count, $rand);
  182.  
  183.     if(! $random)
  184.     {
  185.         $length = 4;
  186.     }
  187.  
  188.     for($count = 0; length($nop) < $length; $count++)
  189.     {
  190.         $rand = int(rand(scalar(@{$table})));
  191.  
  192.         $tempnop = $table->[$rand]->[0]($table->[$rand]->[1], $length - length($nop));
  193.  
  194.         if(!Pex::Utils::ArrayContains([split('', $tempnop)], [split('', $badChars)]))
  195.         {
  196.             $nop .= $tempnop;
  197.             $count = 0;
  198.         }
  199.  
  200.         if($count > $length + 10000)
  201.         {
  202.             $self->PrintDebugLine(3, "Iterated $count times with no nop match.");
  203.             return;
  204.         }
  205.     }
  206.  
  207.     if(! $random)
  208.     {
  209.         $nop = $nop x ($backup_length / 4);
  210.     }
  211.  
  212.     return $nop;
  213. }
  214.  
  215. 1;
  216.